//矩阵区域和
class Solution {
public:
    vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) 
    {
        //二维前缀和
        int m=mat.size();
        int n=mat[0].size();
        vector<vector<int>>res(m,vector<int>(n));
        vector<vector<int>>dp(m+1,vector<int>(n+1,0));
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+mat[i-1][j-1];
            }
        }
        //前缀和数组填写完成
        //开始填res
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                //x1 y1 x2 y2是下标值 +1 才是dp中的下标 dp表示的是第几个元素
                int x1=max(0,i-k)+1; int y1=max(0,j-k)+1;
                int x2=min(m-1,i+k)+1; int y2=min(n-1,j+k)+1;
                res[i][j]=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];
            }
        }
        return res;
    }
};
//连续数组
class Solution {
public:
    //将0 转变为-1 本题即转换成为寻找和为0的子数组
    //因为本题需要求的是最长的子数组长度
    //哈希表中存的就是 当前总和,数组的下标
    //  2,1       2,5
    //1 1 1 1 -1 -1 1
    //0 1 2 3  4  5 6
    //如上 在i=5时 sum=2在 hash表中找到了sum=2的元素 其下标为1
    //所以i-1即为长度
    //所以如果出现了sum相同但是下标不同的结果
    //无需保存新的结果 因为sum出现的下标越小 则数组的长度越大
    int findMaxLength(vector<int>& nums) 
    {
        int res=0;
        int sum=0;
        unordered_map<int,int>hash;//前缀和,出现该前缀和的下标
        hash[0]=-1;//默认有前缀和为0的情况 下标为0的前一个即-1
        for(int i=0;i<nums.size();i++)
        {
            sum+=nums[i]==0?-1:1;
            if(hash.count(sum)) res=max(res,i-hash[sum]);
            else hash[sum]=i;
        }
        return res;
    }
};

//二维前缀和
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int n=0,m=0,q=0;
    cin>>n>>m>>q;
    vector<vector<int>>nums(n+1,vector<int>(m+1,0));
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>nums[i][j];
        }
    }
    //前缀和数组
    vector<vector<long long>>dp(n+1,vector<long long>(m+1,0));
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            dp[i][j]=dp[i-1][j]+dp[i][j-1]+nums[i][j]-dp[i-1][j-1];
        }
    }
    int x1=0,y1=0,x2=0,y2=0;
    while(q--)
    {
        cin>>x1>>y1>>x2>>y2;
        //画图理解
        cout<<dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1]<<endl;
    }
    return 0;
}
